#!/bin/bash

# 灵感发生器 - 自动化部署脚本
# 使用方法: ./deploy.sh [dev|prod]

set -e

# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m' # No Color

# 日志函数
log_info() {
    echo -e "${BLUE}[INFO]${NC} $1"
}

log_success() {
    echo -e "${GREEN}[SUCCESS]${NC} $1"
}

log_warning() {
    echo -e "${YELLOW}[WARNING]${NC} $1"
}

log_error() {
    echo -e "${RED}[ERROR]${NC} $1"
}

# 检查环境
check_environment() {
    log_info "检查运行环境..."
    
    # 检查Node.js
    if ! command -v node &> /dev/null; then
        log_error "Node.js 未安装，请先安装 Node.js >= 14.0.0"
        exit 1
    fi
    
    NODE_VERSION=$(node -v | cut -d'v' -f2 | cut -d'.' -f1)
    if [ "$NODE_VERSION" -lt 14 ]; then
        log_error "Node.js 版本过低，需要 >= 14.0.0，当前版本: $(node -v)"
        exit 1
    fi
    
    log_success "Node.js 版本: $(node -v)"
    
    # 检查npm
    if ! command -v npm &> /dev/null; then
        log_error "npm 未安装"
        exit 1
    fi
    
    log_success "npm 版本: $(npm -v)"
}

# 安装依赖
install_dependencies() {
    log_info "安装项目依赖..."
    
    if [ -f "package-lock.json" ]; then
        npm ci
    else
        npm install
    fi
    
    log_success "依赖安装完成"
}

# 配置环境变量
setup_environment() {
    log_info "配置环境变量..."
    
    if [ ! -f ".env" ]; then
        if [ -f "env.example" ]; then
            cp env.example .env
            log_warning "已创建 .env 文件，请编辑配置API密钥"
        else
            log_warning ".env 文件不存在，请手动创建"
        fi
    else
        log_success ".env 文件已存在"
    fi
}

# 启动开发服务器
start_dev_server() {
    log_info "启动开发服务器..."
    
    if command -v nodemon &> /dev/null; then
        npm run dev
    else
        log_warning "nodemon 未安装，使用 node 启动"
        node server.js
    fi
}

# 启动生产服务器
start_prod_server() {
    log_info "启动生产服务器..."
    
    # 检查PM2
    if command -v pm2 &> /dev/null; then
        log_info "使用 PM2 启动服务..."
        
        # 停止现有进程
        pm2 stop inspiration-generator 2>/dev/null || true
        pm2 delete inspiration-generator 2>/dev/null || true
        
        # 启动新进程
        pm2 start server.js --name "inspiration-generator" --env production
        
        # 保存PM2配置
        pm2 save
        
        log_success "服务已启动，使用 'pm2 logs inspiration-generator' 查看日志"
        log_success "使用 'pm2 status' 查看服务状态"
    else
        log_warning "PM2 未安装，使用 node 启动"
        log_info "建议安装 PM2: npm install -g pm2"
        NODE_ENV=production node server.js
    fi
}

# 健康检查
health_check() {
    log_info "执行健康检查..."
    
    # 等待服务启动
    sleep 3
    
    # 检查API健康状态
    if curl -f http://localhost:3000/api/health > /dev/null 2>&1; then
        log_success "API服务运行正常"
    else
        log_error "API服务检查失败"
        exit 1
    fi
    
    # 检查前端页面
    if curl -f http://localhost:3000/M.html > /dev/null 2>&1; then
        log_success "前端页面可访问"
    else
        log_warning "前端页面检查失败"
    fi
}

# 显示访问信息
show_access_info() {
    echo ""
    log_success "🎉 部署完成！"
    echo ""
    echo "📱 访问地址:"
    echo "   前端页面: http://localhost:3000/M.html"
    echo "   API文档:  http://localhost:3000/api/health"
    echo ""
    echo "🔧 管理命令:"
    echo "   查看日志: pm2 logs inspiration-generator"
    echo "   重启服务: pm2 restart inspiration-generator"
    echo "   停止服务: pm2 stop inspiration-generator"
    echo ""
}

# 主函数
main() {
    local mode=${1:-dev}
    
    echo "🚀 灵感发生器 - 自动化部署脚本"
    echo "=================================="
    
    # 检查环境
    check_environment
    
    # 安装依赖
    install_dependencies
    
    # 配置环境变量
    setup_environment
    
    # 根据模式启动服务
    if [ "$mode" = "prod" ]; then
        start_prod_server
    else
        start_dev_server &
        SERVER_PID=$!
        
        # 健康检查
        health_check
        
        # 显示访问信息
        show_access_info
        
        # 等待用户中断
        echo "按 Ctrl+C 停止服务"
        wait $SERVER_PID
    fi
}

# 清理函数
cleanup() {
    log_info "正在清理..."
    if [ ! -z "$SERVER_PID" ]; then
        kill $SERVER_PID 2>/dev/null || true
    fi
    exit 0
}

# 设置信号处理
trap cleanup SIGINT SIGTERM

# 运行主函数
main "$@" 